一、概述
矩陣 類別提供了一個在 JavaScript 中建立和操作矩陣的完整框架。它繼承自原生的 Array,並擴充了大量用於線性代數運算的屬性和方法。
您可以透過兩種主要方式來初始化一個 矩陣 物件:
指定維度與預設值:提供橫列數、直行數和一個可選的初始值來建立矩陣。
從陣列初始化:提供一個二維陣列(陣列的陣列)來直接建立矩陣。
範例:建立矩陣
import 矩陣 from 'dx-core';
// 方法1: 建立一個 3x4 的矩陣,所有元素皆為 0
const m1 = new 矩陣(3, 4);
console.log(m1.轉為字串());
/*
[
[ 0 0 0 0 ]
[ 0 0 0 0 ]
[ 0 0 0 0 ]
]
*/
// 方法2: 建立一個 2x2 的矩陣,並以 5 填滿
const m2 = new 矩陣(2, 2, 5);
console.log(m2.轉為字串());
/*
[
[ 5 5 ]
[ 5 5 ]
]
*/
// 方法3: 從現有陣列建立矩陣
const m3 = new 矩陣(
[1, 2, 3],
[4, 5, 6]
);
console.log(m3.轉為字串());
/*
[
[ 1 2 3 ]
[ 4 5 6 ]
]
*/
二、屬性
.列秩
回傳矩陣的列秩(Rank),即其橫列空間的維度。這是透過計算矩陣的上三角形式中非零橫列的數量來得到的。
回傳:
Number
const m = new 矩陣([1, 2], [2, 4]);
console.log(m.列秩);
// 輸出: 1
.橫列數量
回傳矩陣的橫列(row)數量。
回傳:
Number
const m = new 矩陣(5, 3);
console.log(m.橫列數量);
// 輸出: 5
.特徵值
回傳矩陣的行列式(Determinant)。
注意:雖然屬性名稱為
特徵值(Eigenvalue),但其內部實作是計算行列式。它透過將矩陣化為上三角矩陣,然後將主對角線上的元素相乘來求得。
回傳:
Number
const m = new 矩陣([4, 2], [1, 3]);
console.log(m.特徵值);
// 輸出: 10 (4 * 3 - 2 * 1)
.直行數量
回傳矩陣的直行(column)數量。
回傳:
Number
const m = new 矩陣(5, 3);
console.log(m.直行數量);
// 輸出: 3
三、方法
Static 方法
單位矩陣(橫列數量)
建立並回傳一個指定大小的單位矩陣(Identity Matrix)。
參數
橫列數量(Number):單位矩陣的維度(橫列數和直行數)。
回傳:
矩陣
const I = 矩陣.單位矩陣(3);
console.log(I.轉為字串());
/*
[
[ 1 0 0 ]
[ 0 1 0 ]
[ 0 0 1 ]
]
*/
Instance 方法
上三角矩陣()
將目前矩陣轉換為上三角矩陣(Upper Triangular Matrix)並回傳,原矩陣不變。
回傳:
矩陣- 一個新的上三角矩陣。
const m = new 矩陣([1, 2, 3], [1, 1, 1], [3, 3, 1]);
const upper = m.上三角矩陣();
console.log(upper.轉為字串());
/*
[
[ 1 2 3 ]
[ 0 -1 -2 ]
[ 0 0 -2 ]
]
*/
乘(目標)
執行矩陣乘法。
如果
目標是數字,則執行純量乘法(Scalar Multiplication)。如果
目標是另一個矩陣物件,則執行矩陣乘法。參數
目標(Number|矩陣):要相乘的純量或矩陣。
回傳:
矩陣- 運算後的新矩陣。
const m = new 矩陣([1, 2], [3, 4]);
// 純量乘法
const m_scaled = m.乘(10);
console.log(m_scaled.轉為字串());
/*
[
[ 10 20 ]
[ 30 40 ]
]
*/
// 矩陣乘法
const m2 = new 矩陣([5, 6], [7, 8]);
const m_product = m.乘(m2);
console.log(m_product.轉為字串());
/*
[
[ 19 22 ]
[ 43 50 ]
]
*/
交換橫列(a, b)
交換矩陣中的兩個橫列。
參數
a(Number):第一個橫列的索引。b(Number):第二個橫列的索引。
回傳:
矩陣- 修改後的原矩陣。
const m = new 矩陣([1, 1], [2, 2], [3, 3]);
m.交換橫列(0, 2);
console.log(m.轉為字串());
/*
[
[ 3 3 ]
[ 2 2 ]
[ 1 1 ]
]
*/
修正精確度誤差()
修正矩陣中因浮點數運算產生的微小誤差(例如 2.9999999999999996 會被修正為 3)。
回傳:
矩陣- 修改後的原矩陣。
冪次(n)
計算矩陣的 n 次方。
參數
n(Number):次方數,必須為非負整數。
回傳:
矩陣- 運算後的新矩陣。
const m = new 矩陣([1, 2], [0, 1]);
const m_pow_3 = m.冪次(3);
console.log(m_pow_3.轉為字串());
/*
[
[ 1 6 ]
[ 0 1 ]
]
*/
加(目標)
執行矩陣加法。
如果
目標是數字,則將矩陣的每個元素加上該數值。如果
目標是另一個矩陣物件,則執行對應元素的相加。參數
目標(Number|矩陣):要相加的純量或矩陣。
回傳:
矩陣- 運算後的新矩陣。
const m = new 矩陣([1, 2], [3, 4]);
// 純量相加
const m_plus_10 = m.加(10);
console.log(m_plus_10.轉為字串());
/*
[
[ 11 12 ]
[ 13 14 ]
]
*/
// 矩陣相加
const m2 = new 矩陣([5, 6], [7, 8]);
const m_sum = m.加(m2);
console.log(m_sum.轉為字串());
/*
[
[ 6 8 ]
[ 10 12 ]
]
*/
反矩陣()
使用高斯-喬登消去法計算並回傳反矩陣(Inverse Matrix)。如果矩陣不可逆(非方陣、行列式為零),將會拋出錯誤。
回傳:
矩陣- 原矩陣的反矩陣。
const m = new 矩陣([4, 7], [2, 6]);
const inv_m = m.反矩陣();
console.log(inv_m.轉為字串());
/*
[
[ 0.6 -0.7 ]
[ -0.2 0.4 ]
]
*/
合併直行(m)
將另一個矩陣 m 合併到目前矩陣的右側。
參數
m(矩陣):要合併的矩陣。
回傳:
矩陣- 一個新的、更寬的矩陣。
const m1 = new 矩陣([1], [2]);
const m2 = new 矩陣([3], [4]);
const combined = m1.合併直行(m2);
console.log(combined.轉為字串());
/*
[
[ 1 3 ]
[ 2 4 ]
]
*/
填滿(值)
用指定的值填滿整個矩陣。
參數
值(any):用來填滿矩陣的數值。
回傳:
矩陣- 修改後的原矩陣。
const m = new 矩陣(2, 3);
m.填滿(7);
console.log(m.轉為字串());
/*
[
[ 7 7 7 ]
[ 7 7 7 ]
]
*/
是反對稱矩陣()
檢查矩陣是否為反對稱矩陣 (Antisymmetric Matrix),即 AT=−A。
回傳:
Boolean
是對稱矩陣()
檢查矩陣是否為對稱矩陣 (Symmetric Matrix),即 AT=A。
回傳:
Boolean
是方塊矩陣()
檢查矩陣是否為方塊矩陣(Square Matrix),即橫列數等於直行數。
回傳:
Boolean
橫列(橫列編號)
取得指定索引的橫列。
參數
橫列編號(Number):橫列的索引。
回傳:
向量- 一個代表該橫列的向量物件。
const m = new 矩陣([1, 2, 3], [4, 5, 6]);
const row1 = m.橫列(1);
console.log(row1); // 假設向量物件有 toString 方法
// 輸出: [4, 5, 6]
每一個元素(回呼函式)
遍歷矩陣中的每一個元素。
參數
回呼函式(Function):對每個元素執行的函式,接收(元素, 橫列編號, 直行編號)三個參數。
回傳:
矩陣- 原矩陣。
每一個橫列(回呼函式)
遍歷矩陣中的每一個橫列。
參數
回呼函式(Function):對每個橫列執行的函式,接收(橫列, 橫列編號)兩個參數。
回傳:
矩陣- 原矩陣。
每一個直行(回呼函式)
遍歷矩陣中的每一個直行。
參數
回呼函式(Function):對每個直行執行的函式,接收(直行, 直行編號)兩個參數。
回傳:
矩陣- 原矩陣。
清除()
清除矩陣的所有內容,使其成為一個 0x0 的矩陣。
回傳:
矩陣- 修改後的原矩陣。
減(目標)
執行矩陣減法。
如果
目標是數字,則將矩陣的每個元素減去該數值。如果
目標是另一個矩陣物件,則執行對應元素的相減。參數
目標(Number|矩陣):要相減的純量或矩陣。
回傳:
矩陣- 運算後的新矩陣。
const m = new 矩陣([10, 20], [30, 40]);
// 純量相減
const m_minus_5 = m.減(5);
console.log(m_minus_5.轉為字串());
/*
[
[ 5 15 ]
[ 25 35 ]
]
*/
// 矩陣相減
const m2 = new 矩陣([1, 2], [3, 4]);
const m_diff = m.減(m2);
console.log(m_diff.轉為字串());
/*
[
[ 9 18 ]
[ 27 36 ]
]
*/
直行(直行編號)
取得指定索引的直行。
參數
直行編號(Number):直行的索引。
回傳:
Array- 一個代表該直行的陣列。
const m = new 矩陣([1, 2, 3], [4, 5, 6]);
const col2 = m.直行(2);
console.log(col2);
// 輸出: [3, 6]
等於(目標)
檢查目前矩陣是否與另一個矩陣 目標 完全相等。
參數
目標(矩陣):要比較的矩陣。
回傳:
Boolean- 如果維度和所有元素都相同,則為true。
const m1 = new 矩陣([1, 2], [3, 4]);
const m2 = new 矩陣([1, 2], [3, 4]);
const m3 = new 矩陣([1, 2], [3, 5]);
console.log(m1.等於(m2)); // true
console.log(m1.等於(m3)); // false
總和(初始值 = 0)
計算矩陣所有元素的總和。
參數
初始值(Number, optional):加總的起始值,預設為0。
回傳:
Number- 所有元素的總和。
複製()
建立並回傳一個與目前矩陣完全相同的新矩陣副本。
回傳:
矩陣- 新的矩陣副本。
複製範圍(…)
從矩陣中複製一個指定範圍的子矩陣。
參數
起始橫列編號(Number)起始直行編號(Number)橫列數量(Number)直行數量(Number)
回傳:
矩陣- 新的子矩陣。
設定橫列(橫列編號, 值)
用一個向量或陣列來設定指定的橫列。
參數
橫列編號(Number):要設定的橫列索引。值(向量|Array):新的橫列內容。
回傳:
矩陣- 修改後的原矩陣。
設定直行(直行編號, 值)
用一個向量或陣列來設定指定的直行。
參數
直行編號(Number):要設定的直行索引。值(向量|Array):新的直行內容。
回傳:
矩陣- 修改後的原矩陣。
設定維度(新的橫列數量, 新的直行數量)
重新設定矩陣的維度。所有現有元素將被清除,並以預設值(或建構時指定的值)重新填滿。
參數
新的橫列數量(Number)新的直行數量(Number)
回傳:
矩陣- 修改後的原矩陣。
轉為字串()
將矩陣轉換為格式化的、易於閱讀的字串。
回傳:
String
轉置矩陣()
計算並回傳矩陣的轉置矩陣(Transpose Matrix),即交換橫列與直行。
回傳:
矩陣- 轉置後的新矩陣。
const m = new 矩陣([1, 2, 3], [4, 5, 6]);
const t_m = m.轉置矩陣();
console.log(t_m.轉為字串());
/*
[
[ 1 4 ]
[ 2 5 ]
[ 3 6 ]
]
*/